import { pinyin } from "pinyin-pro";

/**
 * 判断字符是否为中文
 * @param char 要判断的字符
 * @returns 是否为中文字符
 */
export const isChinese = (char: string): boolean => {
  const charCode = char.charCodeAt(0);
  return charCode >= 0x4e00 && charCode <= 0x9fff;
};

/**
 * 获取字符的拼音首字母
 * @param char 中文字符
 * @returns 拼音首字母
 */
export const getChineseFirstLetter = (char: string): string => {
  if (!isChinese(char)) return char;

  // 使用 pinyin-pro 获取拼音
  const pinyinResult = pinyin(char, { toneType: "none" });

  if (pinyinResult) {
    return pinyinResult.charAt(0).toUpperCase(); // 获取拼音首字母并大写
  }

  return "";
};

/**
 * 获取字符串首字母（如果是中文则返回拼音首字母）
 * @param str 输入字符串
 * @returns 首字母
 */
export const getFirstLetter = (str: string): string => {
  if (!str || str.length === 0) return "";

  const firstChar = str.charAt(0);
  return isChinese(firstChar)
    ? getChineseFirstLetter(firstChar)
    : firstChar.toUpperCase();
};

/**
 * 获取字符串最后一个字母（如果是中文则返回拼音首字母）
 * @param str 输入字符串
 * @returns 最后一个字符的首字母
 */
export const getLastLetter = (str: string): string => {
  if (!str || str.length === 0) return "";

  const lastChar = str.charAt(str.length - 1);
  return isChinese(lastChar)
    ? getChineseFirstLetter(lastChar)
    : lastChar.toUpperCase();
};

/**
 * 获取姓名缩写（中文取拼音首字母，英文取首字母，多个单词取每个单词首字母）
 * @param name 姓名
 * @param limit 最大字母数，默认为2
 * @returns 姓名缩写
 */
export const getNameAbbreviation = (
  name: string,
  limit: number = 2
): string => {
  if (!name || name.length === 0) return "";

  // 处理英文名（多个单词）
  if (/^[a-zA-Z\s]+$/.test(name)) {
    const words = name.split(/\s+/).filter((w) => w.length > 0);
    return words
      .map((word) => word.charAt(0).toUpperCase())
      .join("")
      .substring(0, limit);
  }

  // 中文名或其他情况
  let result = "";
  for (let i = 0; i < Math.min(name.length, limit); i++) {
    const char = name.charAt(i);
    result += isChinese(char)
      ? getChineseFirstLetter(char)
      : char.toUpperCase();
  }

  return result;
};

/**
 * 获取完整的拼音字符串
 * @param str 中文字符串
 * @param separator 拼音之间的分隔符
 * @returns 拼音字符串
 */
export const getPinyin = (str: string, separator: string = ""): string => {
  if (!str) return "";

  // 使用 pinyin-pro 获取拼音
  const pinyinArray = pinyin(str, {
    toneType: "none", // 不带声调
    type: "array", // 返回数组形式，每个汉字对应一个拼音
  });

  // 使用指定的分隔符连接拼音
  return pinyinArray.join(separator);
};
